package com.jmm;

import java.util.concurrent.TimeUnit;

/**
 * volatile：是java虚拟机提供的轻量级的同步机制
 * 1、保证可见性
 * 2、不保证原子性
 * 3、禁止指令重排
 */

public class VolatileDemo {
    //给变量加了volatile程序就不会死循环
    //加了volatile可以保证程序的可见性
    private static int num = 0;

    public static void main(String[] args) throws InterruptedException {

        Thread thread = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "----- 开始");
            while (num == 0) {
                try {
                    // TimeUnit.MILLISECONDS.sleep(500);
                    // Thread.sleep(500);
                    /*
                        如果此处对num进行了读，
                        1. 当为加volatile时，也会将主内存的变量值加载到线程的工作内存中
                        2. 当为不加volatile时，不会加载主内存的变量值到线程的工作内存中，则会产生死循环
                     */
                    // System.out.println(Thread.currentThread().getName() + "----- num:" + num);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println(Thread.currentThread().getName() + "----- 检测到了num变化，结束。  num:" + num);
        },"A");
        thread.setDaemon(true);
        thread.start();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (Exception e) {

        }
        num = 1;
        System.out.println(num + "------------------------------------------------");

        TimeUnit.SECONDS.sleep(10);
        System.out.println("主线程结束");
    }
}
